/**
 * 
 */
package org.stars.util.reflect;

import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;

import org.stars.util.StringUtility;

/**
 * Rappresenta un getter.
 * 
 * @author Francesco Benincasa (908099)
 * 
 */
public class Getter extends Accessor {

	static final String[]	getterPrefix	= new String[] { "get", "is" };

	/**
	 * Dato un metodo restituisce il nome della proprietà associata. Il metodo
	 * deve essere un getter
	 * 
	 * @param metodo
	 * @return nome della proprieta' ricavata dal nome del getter
	 */
	static String getPropertyName(Method metodo) {
		String name = null;
		String nomeMetodo = metodo.getName();
		if (metodo.getParameterTypes().length == 0 && !metodo.isBridge()) {
			for (String prefix : getterPrefix) {
				if (nomeMetodo.startsWith(prefix)) {
					name = nomeMetodo.substring(prefix.length());
					name = StringUtility.firstLetterLowercase(name);					
					
					break;
				}
			}
		}
		return name;
	}

	static Getter getGetter(Method method) {
		Getter ret = null;

		String name = getPropertyName(method);

		if (name != null) {
			ret=new Getter(name,method);
		}

		return ret;
	}

	private Getter(String propertyName, Method method) {
		super(propertyName, method, method.getReturnType());		
	}

	public Object invoke(Object obj) throws IllegalArgumentException, IllegalAccessException, InvocationTargetException {
		return method.invoke(obj);
	}
}
